#define  _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
typedef long long int ll;
using namespace std;


//dfs指数枚举
const int N = 20;//最大的有20个数字，及从1-20的所有可能
int n;//你想要有的最大数字
int st[N];//当前状态
vector<vector<int>> ways;//记录方案

void dfs(int u)
{
	if (u > n)//最后一次会++，这里大于时就会结束
	{
		vector<int> tmp;//记录此种状态
		for (int i = 1; i <= n; i++)
		{
			if (st[i] == 1) tmp.push_back(i);
		}
		ways.push_back(tmp);
		return;//不要忘记return
	}
	st[u] = 0;//先走0的可能性
	dfs(u + 1);
	st[u] = 0;//恢复现场

	st[u] = 1;//走1的可能性
	dfs(u + 1);
	st[u] = 0;//恢复现场

}

int main()
{
	sd(n);
	dfs(1);
	for (int i = 0; i < ways.size(); i++)
	{
		int flag = 0;
		for (int j = 0; j < ways[i].size(); j++)
		{
			if (ways[i][j]!=0) cout << ways[i][j] << " ";
			flag = 1;
		}
		if (flag != 0) cout << endl;
	}

	return 0;



}